package person

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 对应着数据库里的  classmates 表
type Classmates struct {
	Name     string
	Pswd     string
	Sn       string
	Birthday time.Time
	Sex      string
	// 钱包
	Account float32
}

// 注册
func (p *Classmates) Register() bool {

	return true
}

// 全局的数据库
var DB *gorm.DB

// 连接数据库
func ConnectDB() bool {
	//  1. 连接数据库
	dsn := "gln:123456@tcp(172.40.0.141:3306)/chuanyou?charset=utf8mb4&parseTime=True"
	var err error
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("数据库连接失败:", err.Error())
		return false
	}
	fmt.Println("数据连接成功")
	return true
}

// 1. 结构体的方法的编写
// 2. 结构体方法的调用

// 登录
func (p *Classmates) Login() bool {
	fmt.Println("请输入你的学号")
	var sn string
	fmt.Scanln(&sn)
	var pswd string
	fmt.Println("请输入你的密码")
	fmt.Scanln(&pswd)

	jiami := md5.New()
	jiami.Write([]byte(pswd))
	pswd = hex.EncodeToString(jiami.Sum(nil))
	// 2. 用学号，去数据库查询 这个人的信息

	DB.Raw("SELECT * FROM chuanyou.classmates where sn=?", sn).Scan(p)

	// 3.把这个人的信息中密码拿来 和 刚刚输入的密码进行比对，如果相同，那么就是登录成功
	if p.Pswd == pswd {
		return true
	} else {
		fmt.Println("数据库里的密码是：", p.Pswd)
		fmt.Println("你输入的密码是:", pswd)
		return false
	}

}

// 吃饭
func (p *Classmates) Chifan() bool {

	return true
}

// 充值
func (p *Classmates) Chongzhi() {
	fmt.Println("充值前的额度是:", p.Account)
	fmt.Println("请输入你的充值额度")
	var edu float32
	fmt.Scanln(&edu)
	p.Account = p.Account + edu

	DB.Exec("update chuanyou.classmates set account=? where sn=?", p.Account, p.Sn)
	fmt.Println("充值完成")

}

// 修改个人密码
func (p *Classmates) ModifyPswd() {
	// 1.用数据库运行 sql
	var newpswd string
	fmt.Println("请输入你的新密码")
	fmt.Scanln(&newpswd)

	jiami := md5.New()
	jiami.Write([]byte(newpswd))
	newpswd = hex.EncodeToString(jiami.Sum(nil))

	DB.Exec("update chuanyou.classmates set pswd = ? where sn = ?", newpswd, p.Sn)
	fmt.Println("修改完成")

}

// 查询全体女生
func QueryGirls() {
	var girls []*Classmates
	DB.Raw("select * from chuanyou.classmates where sex='女'").Scan(&girls)
	for _, girl := range girls {
		fmt.Println(girl.Name, girl.Sn, girl.Sex, girl.Pswd)
	}

}
